Edifice Engine ChangeManager
介绍
ChangeManager 用于记录对象(obj)的属性(key)改动。
ChangeManager 维护了一个 changes 结构,用于记录改动。元素是一个 tuple,含义分别为:
(对象, key, 对象是否有这个 key, 旧值, 新值)
使用场景
ChangeManager 并不是直接使用的,而是被 contextmanager 包装了一层:
@contextlib.contextmanager
def _storage_manager():
changes = _ChangeManager()
try:
yield changes
except Exception as e:
changes.unwind()
raise e
可以看到,包装的主要作用,是可以自动拦截异常,进行错误日志打印。
实际 ChangeManager 的使用场景,要看 _storage_manager 的使用场景。用于 Engine 的 _request_rerender。
ChangeManager 代码
class _ChangeManager(object):
__slots__ = ("changes",)
def __init__(self):
self.changes = []
def set(self, obj, key, value):
old_value = None
if hasattr(obj, key):
old_value = getattr(obj, key)
self.changes.append((obj, key, hasattr(obj, key), old_value, value))
setattr(obj, key, value)
def unwind(self):
logger.warning("Encountered error while rendering. Unwinding changes.")
# 省略异常报错逻辑